﻿using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace Web.Controllers
{
    public class BaseController : Controller
    {

        public static string Appid = System.Configuration.ConfigurationManager.AppSettings["AppId"];
        public static string AppSecret = System.Configuration.ConfigurationManager.AppSettings["AppSecret"];
        public static string MchId = System.Configuration.ConfigurationManager.AppSettings["WeiXinMchid"];
        public static string Key = System.Configuration.ConfigurationManager.AppSettings["WeiXinKey"];

        public static string Money = System.Configuration.ConfigurationManager.AppSettings["Money"];
        public static string Notify = System.Configuration.ConfigurationManager.AppSettings["NotifyUrl"];
        public static string state = "verify";


        //public Subscriber Subscriber
        //{
        //    get
        //    {
        //        Subscriber Subscriber = null;

        //        //string redisKey = RedisKey.Subscriber(OpenId);
        //        //if (EnableCaching && RedisHelper.Exist(redisKey))
        //        //{
        //        //    Subscriber = RedisHelper.Single_Get_Itme<Subscriber>(redisKey);
        //        //    return Subscriber;
        //        //}
        //        //else
        //        //{
        //        //    Subscriber = dal.Get<Subscriber>(OpenId);
        //        //    if (Subscriber != null)
        //        //    {
        //        //        if (EnableCaching)
        //        //        {
        //        //            RedisHelper.Single_Set_Itme<Subscriber>(redisKey, Subscriber, DateTime.Now.Date.AddDays(1) - DateTime.Now);
        //        //        }
        //        //    }
        //        //    else
        //        //    {
        //        //        Subscriber = new Subscriber();
        //        //    }
        //        //}

        //        Subscriber = dal.Get<Subscriber>(OpenId);

        //        return Subscriber;
        //    }
        //}


        //protected override void OnAuthorization(AuthorizationContext filterContext)
        //{
        //    //Debuglog("当前url：\r\n");
        //    //Debuglog(Request.Url.OriginalString);

        //    string BackUrl = Request.RawUrl;

        //    if (filterContext.ActionDescriptor.ActionName.ToLower() != "NotifyUrl".ToLower() && !Request.IsAjaxRequest())
        //    {
        //        if (string.IsNullOrEmpty(OpenId))
        //        {
        //            #region 判断是否微信登录
        //            //微信返回的CODE
        //            string code = Request.QueryString["code"];

        //            if (!string.IsNullOrEmpty(code))
        //            {
        //                //1：获取access_token
        //                string responseResult = this.GetResponseResult("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + Appid + "&secret=" + AppSecret + "&code=" + code + "&grant_type=authorization_code");
        //                if (responseResult.Contains("access_token"))
        //                {
        //                    JObject accessTokenJObject = JsonConvert.DeserializeObject(responseResult) as JObject;

        //                    //用户openid
        //                    string openId = accessTokenJObject["openid"].ToString();

        //                    Debuglog($"openId:{openId}");
        //                    SetCookie("PayOpenId", accessTokenJObject["openid"].ToString(), 1);
        //                    string unionid = "";
        //                    if (!HasOpenId(openId))
        //                    {

        //                        #region 当前系统不存在用户信息，从微信获取并保存用户信息

        //                        //string userInfoStr = this.GetResponseResult("https://api.weixin.qq.com/sns/userinfo?access_token=" + accessTokenJObject["access_token"].ToString() + "&openid=" + accessTokenJObject["openid"].ToString() + "&lang=zh_CN");

        //                        //if (userInfoStr.Contains("nickname"))
        //                        //{

        //                        //    JObject userInfoJObject = JsonConvert.DeserializeObject(userInfoStr) as JObject;

        //                        //    if (userInfoJObject.Property("unionid") != null)
        //                        //    {
        //                        //        unionid = userInfoJObject["unionid"].ToString();
        //                        //    }

        //                        //    Subscriber member = new Subscriber();
        //                        //    member.NickName = UrlDecode(userInfoJObject["nickname"].ToString());
        //                        //    member.Gender = Convert.ToInt16(userInfoJObject["sex"].ToString());
        //                        //    member.OpenId = userInfoJObject["openid"].ToString();
        //                        //    member.UnionId = unionid;
        //                        //    member.AddDate = DateTime.Now;
        //                        //    member.HeadPortrait = userInfoJObject["headimgurl"].ToString();
        //                        //    member.IsSubscr = 0;
        //                        //    if (dal.Insert(member))
        //                        //    {
        //                        //        Response.Redirect(BackUrl);
        //                        //    }
        //                        //    else
        //                        //    {endregion
        //                        //        Response.Redirect("/error.html");
        //                        //    }
        //                        //}
        //                        //Subscriber member = new Subscriber();
        //                        //member.OpenId = openId;
        //                        //member.AddDate = DateTime.Now;
        //                        //if (dal.Insert(member))
        //                        //{
        //                        //    Response.Redirect(BackUrl);
        //                        //}
        //                        //else
        //                        //{
        //                        //    Response.Redirect("/error.html");
        //                        //}
        //                        #endregion
        //                    }
        //                    else
        //                    {
        //                        var subscriber = GetSubscriberFromCache(accessTokenJObject["openid"].ToString());
        //                        if (subscriber == null)
        //                        {
        //                            Response.Redirect("/error.html");
        //                        }

        //                        Response.Redirect(BackUrl);
        //                    }
        //                }
        //                else
        //                {
        //                    //  Response.Redirect("/error.html");
        //                }
        //            }
        //            else if (!string.IsNullOrEmpty(Request.QueryString["state"]))
        //            {
        //                Response.Redirect(BackUrl);
        //            }
        //            else
        //            {
        //                //string str6 = "snsapi_userinfo";
        //                //if (!string.IsNullOrEmpty(GetCookie("openid")))
        //                //{
        //                //    str6 = "snsapi_base";
        //                //}

        //                string str6 = "snsapi_base";
        //                string str7 = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + Appid + "&redirect_uri=" + UrlEncode(Request.Url.ToString().Replace(":" + Request.Url.Port, "")) + "&response_type=code&scope=" + str6 + "&state=" + state + "#wechat_redirect";
        //                //Debuglog(@"微信授权：\r\n");
        //                //Debuglog(str7);
        //                Response.Redirect(str7);
        //                filterContext.Result = new RedirectResult(str7);
        //            }
        //            #endregion
        //        }
        //    }
        //    base.OnAuthorization(filterContext);
        //}

        //public static Subscriber GetSubscriberFromCache(string OpenId)
        //{
        //    Subscriber subscriber = null;
        //    //string key = RedisKey.Subscriber(OpenId);           
        //    //if (EnableCaching && RedisHelper.Exist(key))
        //    //{
        //    //    subscriber = RedisHelper.Single_Get_Itme<Subscriber>(key);
        //    //}

        //    //if (subscriber == null)
        //    //{
        //    //    subscriber = GetSubscriber(OpenId);
        //    //    if (subscriber != null)
        //    //    {
        //    //        if (EnableCaching)
        //    //        {
        //    //            RedisHelper.Single_Set_Itme<Subscriber>(key, subscriber, (DateTime.Now.Date.AddDays(1) - DateTime.Now));
        //    //        }
        //    //    }
        //    //}
        //    subscriber = GetSubscriber(OpenId);
        //    return subscriber;
        //}

        //public static Subscriber GetSubscriber(string openid)
        //{
        //    Subscriber subscriber;
        //    string sql = string.Format(@"select * from Subscriber where openid='{0}'", openid);
        //    subscriber = dal.GetBySql<Subscriber>(sql);
        //    return subscriber;
        //}

        //private bool HasOpenId(string openid)
        //{
        //    if (string.IsNullOrEmpty(openid))
        //    {
        //        return false;
        //    }
        //    string sql = "select count(1) from Subscriber where openid='" + openid + "' ";

        //    if (dal.Count(sql, null) > 0)
        //    {
        //        return true;
        //    }
        //    else
        //    {
        //        return false;
        //    }

        //}

        public string OpenId
        {
            get
            {
                string value = GetCookie("PayOpenId");
                if (!string.IsNullOrEmpty(value))
                {
                    return value;
                }
                return "";
            }
        }

        protected string GetResponseResult(string url)
        {
            using (HttpWebResponse response = (HttpWebResponse)WebRequest.Create(url).GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    {
                        return reader.ReadToEnd();
                    }
                }
            }
        }

        public void SetCookie(string cookieName, string value, int days)
        {
            var AccessToken = new HttpCookie(cookieName.Trim(), value);
            AccessToken.Expires = DateTime.Now.AddDays(days);
            Response.Cookies.Add(AccessToken);
        }

        public string GetCookie(string cookieName)
        {
            if (!string.IsNullOrEmpty(cookieName))
            {
                HttpCookie cookie = Request.Cookies.Get(cookieName);
                if (cookie != null)
                {
                    return cookie.Value;
                }
                return "";
            }
            return "";
        }

        //根据OpenId,判断用户是否存在
        //private bool HasOpenId(string openid)
        //{
        //    if (string.IsNullOrEmpty(openid))
        //    {
        //        return false;
        //    }
        //    string sql = "select count(1) from Subscriber where openid='" + openid + "' ";

        //    if (dal.Count(sql, null) > 0)
        //    {
        //        return true;
        //    }
        //    else
        //    {
        //        return false;
        //    }

        //}

        public static string UrlDecode(string urlToDecode)
        {
            if (string.IsNullOrEmpty(urlToDecode))
            {
                return urlToDecode;
            }
            return HttpUtility.UrlDecode(urlToDecode, Encoding.UTF8);
        }

        public static string UrlEncode(string urlToEncode)
        {
            if (string.IsNullOrEmpty(urlToEncode))
            {
                return urlToEncode;
            }
            return HttpUtility.UrlEncode(urlToEncode, Encoding.UTF8);
        }

        //public static Subscriber GetSubscriberFromCache(string OpenId)
        //{
        //    Subscriber subscriber = null;
        //    //string key = RedisKey.Subscriber(OpenId);           
        //    //if (EnableCaching && RedisHelper.Exist(key))
        //    //{
        //    //    subscriber = RedisHelper.Single_Get_Itme<Subscriber>(key);
        //    //}

        //    //if (subscriber == null)
        //    //{
        //    //    subscriber = GetSubscriber(OpenId);
        //    //    if (subscriber != null)
        //    //    {
        //    //        if (EnableCaching)
        //    //        {
        //    //            RedisHelper.Single_Set_Itme<Subscriber>(key, subscriber, (DateTime.Now.Date.AddDays(1) - DateTime.Now));
        //    //        }
        //    //    }
        //    //}
        //    subscriber = GetSubscriber(OpenId);
        //    return subscriber;
        //}

        //public static Subscriber GetSubscriber(string openid)
        //{
        //    Subscriber subscriber;
        //    string sql = string.Format(@"select * from Subscriber where openid='{0}'", openid);
        //    subscriber = dal.GetBySql<Subscriber>(sql);
        //    return subscriber;
        //}

        private static object LockLog = new object();

        public static void Debuglog(string log, string logname = "_Debuglog.txt")
        {
            lock (LockLog)
            {
                try
                {
                    System.IO.StreamWriter writer = System.IO.File.AppendText(HttpRuntime.AppDomainAppPath.ToString() + "log/" + (DateTime.Now.ToString("yyyyMMdd") + logname));
                    writer.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":" + log);
                    writer.WriteLine("---------------");
                    writer.Close();
                }
                catch (Exception)
                {
                }
            }
        }

        public static string GetTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }
    }
}